import { run_test } from '../test-harness';

run_test([
  'transpose(0)',
  '0',

  'transpose([[1,2,3,4]])',
  '[[1],[2],[3],[4]]',

  'transpose([[1],[2],[3],[4]])',
  '[[1,2,3,4]]',

  'transpose(0.0)',
  '0.0',

  'transpose([[a,b],[c,d]])',
  '[[a,c],[b,d]]',

  'transpose([[a,b],[c,d]],1,2)',
  '[[a,c],[b,d]]',

  'transpose([[a,b,c],[d,e,f]],1,2)',
  '[[a,d],[b,e],[c,f]]',

  'transpose([[a,d],[b,e],[c,f]],1,2)',
  '[[a,b,c],[d,e,f]]',

  // not how one-dimensional vectors
  // don't have a transposition.
  'transpose([a,b,c])',
  '[a,b,c]',

  'transpose(a)',
  'transpose(a)',

  'transpose(a,1,2)',
  'transpose(a)',

  'transpose(a,2,1)',
  'transpose(a)',

  'transpose(1+10)',
  '11',

  'transpose(1+10,2,3)',
  '11',

  'transpose(a*b)',
  'transpose(a)*transpose(b)',

  'transpose(a*b,3,4)',
  'transpose(a,3,4)*transpose(b,3,4)',

  'transpose(b*2*a)',
  '2*transpose(a)*transpose(b)',

  'transpose(b*2*a,3,4)',
  '2*transpose(a,3,4)*transpose(b,3,4)',

  'transpose(b+a)',
  'transpose(a)+transpose(b)',

  'transpose(b+a,3,4)',
  'transpose(a,3,4)+transpose(b,3,4)',

  'transpose(inner(a,b))',
  'inner(transpose(b),transpose(a))',

  'transpose(inner(a,b),3,4)',
  'inner(transpose(b,3,4),transpose(a,3,4))',

  'transpose(transpose(a))',
  'a',

  'transpose(transpose(transpose(a)))',
  'transpose(a)',

  'transpose(transpose(transpose(transpose(a))))',
  'a',

  'transpose(transpose(a),3,4)',
  'transpose(transpose(a),3,4)',

  'transpose(transpose(transpose(a),3,4))',
  'transpose(transpose(transpose(a),3,4))',

  'transpose(transpose(transpose(a),3,4))',
  'transpose(transpose(transpose(a),3,4))',

  'transpose(transpose(transpose(a),1,2))',
  'transpose(a)',

  'transpose(transpose(transpose(a),2,1))',
  'transpose(a)',

  'transpose(transpose(a,3,4),4,3)',
  'a',

  'transpose(transpose(a,3,4),5,6)',
  'transpose(transpose(a,3,4),5,6)',

  'transpose(a) - transpose(a)',
  '0',

  'transpose(a,1,2) - transpose(a,1,2)',
  '0',

  'transpose(a,3,4) - transpose(a,3,4)',
  '0',

  'aᵀ^b',
  'transpose(a)^b',

  'a^ᵀb',
  'a^ᵀ ? b\nStop: syntax error',

  'aᵀ^2^3',
  'transpose(a)^8',

  'aᵀ',
  'transpose(a)',

  'aᵀᵀ',
  'a',

  'aᵀᵀᵀ',
  'transpose(a)',

  'aᵀᵀᵀᵀ',
  'a',

  'aᵀ+b',
  'b+transpose(a)',

  'aᵀ*b',
  'b*transpose(a)',

  // this output could be written out more
  // cleanly without extra parens
  'aᵀ^bᵀ',
  'transpose(a)^(transpose(b))',

  'aᵀ*bᵀ',
  'transpose(a)*transpose(b)',

  'a^bᵀ',
  'a^(transpose(b))',

  '(a^b)ᵀ',
  'transpose(a^b)',

  '(a*b)ᵀ',
  'transpose(a)*transpose(b)',

  'inner(a,b)ᵀ',
  'inner(transpose(b),transpose(a))',

  'dot(a,b)ᵀ',
  'inner(transpose(b),transpose(a))',

  '(a·b·c)ᵀ',
  'inner(transpose(c),inner(transpose(b),transpose(a)))',

  'Iᵀᵀᵀ',
  'I',

  // Note that we are using the
  // standard commutative multiplication here,
  // not the dot product.
  // So, one of the two arguments should
  // be a scalar, but we don't know
  // which one, so we have to transpose
  // both. Note that we
  // don't invert the order because
  // we know it's a normal
  // multiplication.
  'transpose(A)*transpose(x)',
  'transpose(A)*transpose(x)',
]);
